package Test.Product;

import java.util.*;

/**
 * @author success
 * @version 1.0
 * @description:本类用来演示:
 * @date 2019/8/1 0001
 */
public class TestProduct {
    public static void main(String[] args) {
        List<Product> list = new ArrayList<>();
        Product p1 = new Product("宝洁","洗手粉",18.5);
        Product p2 = new Product("联合利华","肥皂",4.5);
        Product p3 = new Product("宝洁","牙膏",32.5);
        Product p4 = new Product("宝洁","毛巾",14.5);
        Product p5 = new Product("洁利","洗面奶",26.0);
        Product p6 = new Product("好迪","洗发水",27.5);
        Product p7 = new Product("多芬","沐浴露",38.5);
        Product p8 = new Product("宝洁","洗洁精",3.4);

        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);
        list.add(p6);
        list.add(p7);
        list.add(p8);

      //  method02(list);
        test03(list);
    }

    /**
     * 利用的是内置的Entry对象来封装key - value
     *                              品牌名 - 总价
     * @param list
     */
    @SuppressWarnings("all")
//    public static void method02(List<Product> list){
//            //创建一个map集合,用来保存?
//            //key代表的是品牌的名称
//            //value是该品牌对应的所有的product对象.
//            Map<String,List<Product>> map = new HashMap<>();
//
//            //遍历list集合
//            //目的 - 将品牌和各自的p对应起来.
//            for(Product p:list){
//                //获取品牌的名称
//                String brand = p.getBrand();
//
//                //判断map集合中是否包含key - 品牌名
//                if(map.containsKey(brand)){
//                    //根据key获取值
//                    List<Product> oldProds = map.get(brand);
//                    oldProds.add(p);
//                }else{
//                    //创建每个品牌的集合
//                    List<Product> products = new ArrayList<>();
//                    products.add(p);
//                    map.put(brand,products);
//                }
//            }
//
//           //创建一个map集合  - key - total
//           Map<String,Double> vosMap = new HashMap<>();
//
//            //map.forEach((k,v)->System.out.println(k+"->"+v));
//            //统计每个品牌和它的总价
//            Set<String> sets = map.keySet();
//            Iterator<String> iter = sets.iterator();
//            while(iter.hasNext()){
//                String key = iter.next();
//
//                //拿到这个品牌的集合对象
//                List<Product> px = map.get(key);
//
//                //定义一个总价 - 每个品牌的
//                double total = 0.0D;
//
//                //遍历集合
//                for (Product p:px){
//                    total+= p.getCost();
//                }
//
//                //重新认识一下实体类 - 特殊容器的"数组" - 数据在内存中的载体.
//                //System.out.println(key+"->"+total);
//                vosMap.put(key,total);
//            }
//            //创建一个集合,用来封装内置的Entry
//            List<Map.Entry<String,Double>> sortList = new ArrayList<>();
//
//            //采用map集合的第二种迭代方式
//            Set<Map.Entry<String,Double>> entrys = vosMap.entrySet();
//            Iterator<Map.Entry<String,Double>> iters = entrys.iterator();
//            while(iters.hasNext()){
//                Map.Entry<String,Double> entry = iters.next();
//
//                sortList.add(entry);
//            }
//
//            Collections.sort(sortList, new Comparator<Map.Entry<String, Double>>() {
//                @Override
//                public int compare(Map.Entry<String, Double> o1, Map.Entry<String, Double> o2) {
//                    if(o1.getValue()>o2.getValue())
//                        return -1;
//                    else if(o1.getValue()<o2.getValue())
//                        return 1;
//                    return 0;
//                }
//            });
//
//            sortList.forEach(System.out::println);
//
//        }
//
//
//    /**
//     * 思想 - 第三方实体类
//     * 神似 - 1 1 2 1 2 4 2 1 1 2 4 5 ...
//     *
//     * 分析 - 统计 - 排序[数据处理]
//     * 根据品牌来统计每个品牌的产品的总价.
//     * @param list
//     */
//    @SuppressWarnings("all")
//    private static void method01(List<Product> list) {
//        //创建一个map集合,用来保存?
//        //key代表的是品牌的名称
//        //value是该品牌对应的所有的product对象.
//        Map<String,List<Product>> map = new HashMap<>();
//
//        //遍历list集合
//        //目的 - 将品牌和各自的p对应起来.
//        for(Product p:list){
//            //获取品牌的名称
//            String brand = p.getBrand();
//
//            //判断map集合中是否包含key - 品牌名
//            if(map.containsKey(brand)){
//                //根据key获取值
//                List<Product> oldProds = map.get(brand);
//                oldProds.add(p);
//            }else{
//                //创建每个品牌的集合
//                List<Product> products = new ArrayList<>();
//                products.add(p);
//                map.put(brand,products);
//            }
//        }
//
//        //创建一个集合 - 为排序做准备的
//        List<ProductVo> vos = new ArrayList<>();
//
//        //map.forEach((k,v)->System.out.println(k+"->"+v));
//        //统计每个品牌和它的总价
//        Set<String> sets = map.keySet();
//        Iterator<String> iter = sets.iterator();
//        while(iter.hasNext()){
//            String key = iter.next();
//
//            //拿到这个品牌的集合对象
//            List<Product> px = map.get(key);
//
//            //定义一个总价 - 每个品牌的
//            double total = 0.0D;
//
//            //遍历集合
//            for (Product p:px){
//                total+= p.getCost();
//            }
//
//            //重新认识一下实体类 - 特殊容器的"数组" - 数据在内存中的载体.
//            //System.out.println(key+"->"+total);
//
//            //创建一个ProductVo对象
//            ProductVo vo = new ProductVo(key,total);
//            //添加到集合中
//            vos.add(vo);
//        }
//        //利用集合的工具类进行排序
//        Collections.sort(vos, new Comparator<ProductVo>() {
//            @Override
//            public int compare(ProductVo o1, ProductVo o2) {
//                if(o1.getTotal()>o2.getTotal()){
//                    return -1;
//                }else if(o1.getTotal()<o2.getTotal()){
//                    return 1;
//                }
//                return 0;
//            }
//        });
//
//        //重新遍历vos
//        vos.forEach(System.out::println);
//    }
    /**
     * 思路:
     * 1.创建map集合,集合中的建和值分别是品牌,存放product对象的list集合
     * 2.我要看map集合中的键(品牌)
     */


    public static void test03(List<Product> list){
        Map<String,List<Product>> map = new HashMap<>();


        for (Product p : list) {//遍历上面传入的集合,去除集合中的每个对象,得到对象中的品牌.
            //接收品牌
            String brand = p.getBrand();

            if (map.containsKey(brand)){//遍历完集合取出对象中的brand之后,如果map中包含这个brand 判断key
                //就将map中这个brand对应的这个集合取出开,然后将这个brand对应的对象,继续添加到这个集合中.
                List<Product> list1 = map.get(brand);//取出原来的集合
                list1.add(p);//将brand对应的这个已经存在的对象,添加到这个旧的集合中
                map.put(brand,list1);//再将这个旧的集合和这个brand一起再放回(put)到原来的map中.
            }else {
                List<Product> productList = new ArrayList<>();
                productList.add(p);

                map.put(brand,productList);
            }

        }
  //      map.forEach((k,v)-> System.out.println(k+":"+v));
//排序的想法:不就是将集合中的品牌和对象中的价格取出来,根据价格进行排序
        Set<String> keySet = map.keySet();//map集合的第一种迭代方式:通过key来获取值
        Map<String,Double> map1 = new HashMap<>();//这个新的map集合存放的是品牌和总价.
        Iterator<String> iterator = keySet.iterator();
        while (iterator.hasNext()){
            String br = iterator.next();
            List<Product> list2 = map.get(br);
            double totle = 0.0d;
            for (Product p1 : list2) {
                totle+=p1.getCost();
            }
            map1.put(br,totle);
        }
        //下面开始进行排序
        Set<Map.Entry<String,Double>> keysets = map1.entrySet();
        Iterator<Map.Entry<String,Double>> iterator1 = keysets.iterator();
        List<Map.Entry<String,Double>> list1 = new ArrayList<>();//创建一个list的集合目的是为了,排序
        while (iterator1.hasNext()){
            list1.add(iterator1.next());
        }
        list1.sort((o1, o2) -> (int)(o2.getValue()-o1.getValue()));//排序结束
        list1.forEach(System.out::println);


    }


}
